#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int x=0;bool f=0;char ch=getchar();
	while(ch<'0'||ch>'9')f^=(ch=='-'),ch=getchar();
	while('0'<=ch&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return f?-x:x;
}
bool st;
const int Maxn=1e7+5,mod=1e9+7;
int n,k;
int ans;
int a[Maxn];
inline int ksm(int a,int k){int res=1;for(;k;k>>=1,a=a*a%mod)if(k&1)res=res*a%mod;return res;}
int inv;
namespace sub{
	const int N=5e5+5;
	int f[N];
	int l[N],r[N];
	struct Tree{int data,tag;}t[N<<2];
	inline void add(int x,int p){
		t[x].data+=p;t[x].tag+=p;
	}
	inline void spread(int x){
		if(!t[x].tag)return;
		add(x<<1,t[x].tag);
		add(x<<1|1,t[x].tag);
		t[x].tag=0;
	}
	void change(int x,int l,int r,int L,int R,int p){
		if(L<=l&&r<=R)return void(add(x,p));
		int mid=l+r>>1;spread(x);
		if(mid>=L)change(x<<1,l,mid,L,R,p);
		if(mid<R)change(x<<1|1,mid+1,r,L,R,p);
		t[x].data=min(t[x<<1].data,t[x<<1|1].data);
	}
	int query(int x,int l,int r,int L,int R){
		if(L<=l&&r<=R)return t[x].data;
		int mid=l+r>>1,res=1e18;spread(x);
		if(mid>=L)res=query(x<<1,l,mid,L,R);
		if(mid<R)res=min(res,query(x<<1|1,mid+1,r,L,R));
		return res;
	}
	stack<int>stk;
	struct node{int l,r,p;};
	vector<node>v[N];
	inline void solve(){
		for(int i=1;i<=n;i++){
			while(stk.size()&&a[stk.top()]<=a[i]){
				r[stk.top()]=i-1;stk.pop();
			}
			if(stk.size())l[i]=stk.top()+1;
			else l[i]=1;
			stk.push(i);
		}
		while(stk.size())r[stk.top()]=n,stk.pop();
		for(int i=1;i<=n;i++){
//			printf("%d:[%d,%d]  [%d,%d]\n",a[i],i,r[i],l[i],i);
			v[i].push_back({l[i],i,a[i]});
			v[r[i]+1].push_back({l[i],i,-a[i]});
		}int mx=0,val=ksm(23,n-1);
		for(int i=1;i<=n;i++){
			for(int j=0;j<v[i].size();j++)
				change(1,1,n,v[i][j].l,v[i][j].r,v[i][j].p);
			mx=max(mx,a[i]);
			if(i<=k)f[i]=mx;
			else f[i]=query(1,1,n,i-k+1,i);
			if(i<n)change(1,1,n,i+1,i+1,f[i]);
			ans=(ans+val*f[i]%mod)%mod;
			val=val*inv%mod;
//			printf("f[%d]=%d\n",i,f[i]);
		}printf("%lld\n",ans);
	}
}
bool en;
signed main(){
//	ios::sync_with_stdio(0);
//	cin.tie(0);cout.tie(0);
//	cerr<<(&st-&en)/1024.0/1024.0<<'\n';
	freopen("knight.in","r",stdin);
	freopen("knight.out","w",stdout);
	n=read();k=read();inv=ksm(23,mod-2);
	for(int i=1;i<=n;i++)a[i]=read();
	sub::solve();
	return 0;
}

